﻿using ExcellentProjectPlus.Dominio.Cuestionarios.Entidades;
using ExcellentProjectPlus.Dominio.Examenes.Entidades;
using ExcellentProjectPlus.Dominio.Examenes.Repositorios;
using ExcellentProjectPlus.Infraestructura.CrossCutting.Notificaciones;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExcellentProjectPlus.Dominio.Examenes.Servicios.Examenes
{
    public class ServicioDeAdministracionDeExamenes
       : IServicioDeAdministracionDeExamenes
    {
        #region Atributos
        IUnidadDeTrabajoExamenes _unidadDeTrabajo;
        INotificationService _notificationService;
        #endregion

        #region Constructores
        public ServicioDeAdministracionDeExamenes(IUnidadDeTrabajoExamenes unidadDeTrabajo,
            INotificationService notificationService)
        {
            _unidadDeTrabajo = unidadDeTrabajo;
            _notificationService = notificationService;
        }
        #endregion

        public IEnumerable<Examen> ObtenerExamen()
        {
            return _unidadDeTrabajo.RepositorioExamen.Obtener();
        }
        public Examen ObtenerExamenPorId(int id)
        {
            return _unidadDeTrabajo.RepositorioExamen.ObtenerPorId(id);
        }
        public void AgregarExamen(Examen examen)
        {
            _unidadDeTrabajo.RepositorioExamen.Agregar(examen);
            _unidadDeTrabajo.Confirmar();
        }
        public void ModificarExamen(Examen examen)
        {
            _unidadDeTrabajo.RepositorioExamen.Modificar(examen);
            _unidadDeTrabajo.Confirmar();
        }
        public void EliminarExamen(Examen examen)
        {
            _unidadDeTrabajo.RepositorioExamen.Eliminar(examen);
            _unidadDeTrabajo.Confirmar();
        }

        public IEnumerable<Examen> ObtenerExamenesPaginado(int pagina, int tamanio)
        {
            return _unidadDeTrabajo.RepositorioExamen.Obtener(orderBy: e => e.OrderBy(exa => exa.IdExamen),
                   page: pagina, pageSize: tamanio);
        }

        public decimal CalificarExamen(Examen examen, Cuestionario cuestionario, dynamic respuestas)
        {
            decimal valorAcumulado = 0;
            //Consulta de los valores correctos del cuestionario
            foreach (var pregunta in cuestionario.PreguntaCuestionarios)
            {
                dynamic respuestaSeleccionada = (respuestas as IEnumerable<dynamic>)
                    .Where(d => d.IdPregunta == pregunta.IdPregunta).FirstOrDefault();
                if (respuestaSeleccionada != null)
                    if (pregunta.Pregunta.Opciones.Any(o =>
                        (o.IdOpcion == respuestaSeleccionada.IdRespuesta) && (o.Respuesta)))
                        valorAcumulado += pregunta.Calificacion;
            }
            examen.Nota = valorAcumulado;
            examen.Estado = "FINALIZADO";
            ModificarExamen(examen);

            //Notificacion del examen al representante
            return valorAcumulado;

        }
        public IQueryable<Examen> ObtenerExamenesRendidosPorEstudiante(int idEstudiante)
        {
            return _unidadDeTrabajo.RepositorioExamen.ObtenerConsulta(e => e.IdEstudiante == idEstudiante &&
                e.Estado.Equals("FINALIZADO", StringComparison.OrdinalIgnoreCase));
        }
    }
}
